package java_learn.java_jinjie.ThreadSafe;

/**
 * 卖票案例出现了线程安全问题
 * 卖票案例出现了线程安全问题
 * 卖出了不存在的票和重复的票
 * <p>
 * 解决线程安全问题的二种方案:使用同步方法
 * 使用步骤:
 * 1.把访问了共享数据的代码抽取出来,放到一个方法中
 * 2.在方法上添加synchronized修饰符
 * <p>
 * 格式:定义方法的格式
 * 修饰符 synchronized 返回值类型 方法名(参数列表){
 * 可能会出现线程安全问题的代码(访问了共享数据的代码)
 * }
 *
 * @Author: 李浩然
 * @Date: 2020/12/18 2:58 下午
 */
public class RunnableSafeImpl2 implements Runnable {
    private int ticket = 100;
    //创建一个锁对象

    /**
     * 卖票
     */
    @Override
    public void run() {
        //判断票是否存在
        while (true) {
            //同步代码块
            payTicket();
        }
    }

    public synchronized void payTicket() {
        if (ticket > 0) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "-->正在卖第" + ticket-- + "张票");
        }
    }
}
